package com.kl.decodeandencode;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;

import java.util.List;

public class MyMessageDecode extends ByteToMessageDecoder {
    // 指定要读取的数据长度
    private int length = 0;

    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) {
        // ByteBuf有自动扩容机制
        System.out.println(in);
        if (in.readableBytes() > 0){
            // 缓冲区里面可以读的字节数大于0
            if (length == 0){
                // 初始化要读取的数据长度
                length = in.readInt(); //读一个Int型,也就是4个字节大小的数据
            }
            if (in.readableBytes() < length){
                System.out.println("当前可读的数据不够,所以的数据还没有传输过来");
                return;
            }
            // 一次性读取length长度的数据
            byte[] contents = new byte[length];
            if (in.readableBytes() >= length){
                in.readBytes(contents);
            }
            // 封装成 MyMessage对象
            MyMessage myMessage = new MyMessage(length,contents);
            // 传递到下一个Handler处理器
            out.add(myMessage);
        }
        // 每读取一次包就要恢复恢复默认值
        length = 0;
    }
}
